package websocket

import (
	"fmt"
	"github.com/xiaobaiskill/fang/internal/impl"
	"github.com/xiaobaiskill/fang/pkg/log"
	"sync"
)

var (
	conm map[*conn]*conn
	lock sync.Mutex
)

func init() {
	conm = make(map[*conn]*conn)
}

type conn struct {
	conn *impl.Connection
}

// 接收消息使用的
func (c *conn) recv() {
	//for {
	//	if body, err := c.conn.ReadMessage(); err != nil {
	//		c.close()
	//		return
	//	} else {
	//		m := make(map[string]string)
	//		err = json.Unmarshal(body, &m)
	//		if err != nil {
	//			log.Logger.Error(fmt.Sprintf("websocket 接收的json 数据格式有误：%v, 数据：",err, string(body)))
	//			continue
	//		} else {
	//			c.handle(m)
	//		}
	//	}
	//}

}

// 处理接收到的消息
func (c *conn) handle(m map[string]string) {
	switch m["type"] {
	case "ping":
		c.send([]byte("pong"))
	default:
		return
	}
}

// 发送消息
func (c *conn) send(body []byte) (b bool) {
	defer func() {
		if e := recover();e != nil{
			b = false
		}
	}()
	err := c.conn.WriteMessage(body)
	if err != nil {
		c.close()
		return false
	}
	return true
}

// 关闭消息
func (c *conn) close() {
	lock.Lock()
	defer lock.Unlock()
	delete(conm,c)
	c.conn.Close()
}

func addConn(c *impl.Connection) *conn {
	con := conn{c}
	lock.Lock()
	defer lock.Unlock()
	conm[&con] = &con
	return &con
}

// 用来发送数据使用的
func SendAll(body []byte) {
	log.Logger.Info(fmt.Sprintf("终于有数据过来可以发送了：%v",string(body)))
	for _, v := range conm {
		v.send(body)
	}
}
